package com.apkcore.core.util

import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.Settings
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.FileProvider
import androidx.fragment.app.Fragment
import com.apkcore.core.toast.Toaster
import java.io.File

object ApkInstallerUtil {

    private var pendingApkFile: File? = null

    /**
     * 初始化用于请求安装未知来源应用权限的 ActivityResultLauncher
     * 这个方法需要在 Fragment 的 onCreate() 或 onViewCreated() 中调用
     */
    fun initializePermissionLauncher(
        fragment: Fragment,
        onPermissionGranted: (apkFile: File) -> Unit
    ): ActivityResultLauncher<Intent> {
        return fragment.registerForActivityResult(
            ActivityResultContracts.StartActivityForResult()
        ) {
            // 检查是否获得安装未知来源应用的权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                if (fragment.requireContext().packageManager.canRequestPackageInstalls()) {
                    // 用户已经授予权限，继续安装 APK
                    pendingApkFile?.let {
                        onPermissionGranted(it)
                    }
                } else {
//                    Toast.makeText(fragment.requireContext(), "", Toast.LENGTH_SHORT).show()
                    Toaster.show("请允许安装未知来源的应用")
                }
            }
        }
    }

    /**
     * 安装 APK 文件，自动处理权限申请
     * @param fragment 上下文
     * @param apkFile APK 文件对象
     */
    fun installApk(
        fragment: Fragment,
        apkFile: File,
        requestInstallPermissionLauncher: ActivityResultLauncher<Intent>
    ) {
        // 检查是否有安装未知来源的权限（仅在 Android 8.0 以上需要）
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            if (!fragment.requireContext().packageManager.canRequestPackageInstalls()) {
                // 没有权限，启动权限请求页面
                val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES).apply {
                    data = Uri.parse("package:${fragment.requireContext().packageName}")
                }
                pendingApkFile = apkFile // 保存 APK 文件，以便权限授予后继续安装
                requestInstallPermissionLauncher.launch(intent)
                return
            }
        }

        // 如果已经有权限，直接安装 APK
        installApkInternal(fragment.requireContext(), apkFile)
    }

    /**
     * 实际的安装 APK 逻辑
     */
    private fun installApkInternal(context: Context, apkFile: File) {
        val apkUri: Uri = getApkUri(context, apkFile)
        val intent = Intent(Intent.ACTION_VIEW).apply {
            setDataAndType(apkUri, "application/vnd.android.package-archive")
            flags = Intent.FLAG_ACTIVITY_NEW_TASK
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        }
        context.startActivity(intent)
    }

    /**
     * 获取 APK 文件的 Uri，兼容 Android 7.0 及以上版本
     * @param context 上下文
     * @param apkFile APK 文件对象
     * @return 文件的 Uri
     */
    private fun getApkUri(context: Context, apkFile: File): Uri {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            FileProvider.getUriForFile(context, "${context.packageName}.provider", apkFile)
        } else {
            Uri.fromFile(apkFile)
        }
    }
}

